package com.leon.lifeenginespace.thread;

import java.util.concurrent.*;

/**
 * @description: 线程池
 * @author: WT
 * @date: 2024/4/5 19:41
 * @Version 1.0 this is the first version
 **/
public class ThreadPool {
    /*
     *FixedThreadPool：线程数固定的线程池；
     *SingleThreadExecutor：仅单线程执行的线程池。
     *CachedThreadPool：线程数根据任务动态调整的线程池；
     */

    //核心线程数
    int min = 4;
    //最大线程数
    int max = 10;
    //存活时间
    long keepAliveTime = 60;
    //存活时间单位
    TimeUnit unit = TimeUnit.SECONDS;
    //工作队列--任务被提交后先放到队列中 等待被执行
    /**
     * 1.arrayblockingqueue 基于数组的阻塞队列:当线程数等于核心线程数时,放入队列中 当队列满时会创建新的线程,如果线程数等于最大线程数时,执行拒绝策略
     * 2.linkedblockingqueue 基于链表的阻塞队列:当队列满时会扩容 ,maxpoolsize很难起作用
     * 3.priorityblockingqueue 优先级阻塞队列:具有优先级的无界队列,没有容量限制,如果队列满时会抛出异常
     * 4.synchronousqueue 同步队列
     */
    //线程工厂--线程工厂的作用是创建线程，为线程起名字，为线程设置优先级等
    //拒绝策略--当线程数等于最大线程数时,执行拒绝策略
    /**
     * 1.CallerRunsPolicy
     * 2.AbortPolicy 抛弃并抛出异常
     * 3.DiscardPolicy 抛弃
     * 4.DiscardOldestPolicy 抛弃队列中最老的任务
     */
    ExecutorService es = new ThreadPoolExecutor(
            min,
            max,
            60L, TimeUnit.SECONDS, new SynchronousQueue<>(), new ThreadFactory() {
        @Override
        public Thread newThread(Runnable r) {

            return  new Thread();
        }
    });



}

class Task implements Runnable {
    public long result;

    @Override
    public void run() {
        long result = System.currentTimeMillis();
        this.result = result;
    }

    public static void main(String[] args) {
        ExecutorService ses = Executors.newScheduledThreadPool(4);
        for (int i = 0; i < 10; i++) {
            ses.submit(new Task());
        }

    }
}